import { getNewCartGoods, reqCheckAllCart, reqDeleteCart, reqFindCartList, reqInsertCart, reqMergeLocalCart, reqUpdateCartSku } from '@/api/cart'

// 购物车状态
export default {
  namespaced: true,
  state: () => {
    return {
      list: []
    }
  },
  mutations: {
    // 加入购物车
    insertCart (state, goods) {
      // 把商品塞到state.list里
      // console.log('goods', goods)
      // 1. 找购物车数组list里有没有相同的商品 找了下标
      const sameIndex = state.list.findIndex(item => item.skuId === goods.skuId)
      // 2. 如果有相同的商品 根据下标把传入的商品跟已有的商品数量进行一个合并
      if (sameIndex >= 0) {
        state.list[sameIndex].count = state.list[sameIndex].count + goods.count
      } else {
        // 3. 如果没有相同的,直接扔到数组里
        state.list.unshift(goods)
      }
    },
    // 删除
    delCart (state, goods) {
      const index = state.list.findIndex(item => item.skuId === goods.skuId)
      state.list.splice(index, 1)
    },
    // 更新商品状态
    updateCart (state, goods) {
      console.log('action遍历时候调用的mutation', goods)
      // 根据skuId 找到要改变的商品
      const sku = state.list.find(item => item.skuId === goods.skuId)
      sku.isEffective = goods.isEffective
      sku.nowPrice = goods.nowPrice
      sku.stock = goods.stock
    },
    // 单选改变状态
    singleCheck (state, { selected, goods }) {
      // 1. 需要找到改变哪个商品的选中状态
      const curItem = state.list.find(item => item.skuId === goods.skuId)
      curItem.selected = selected
    },
    // 全选
    checkEffectAll (state, selected) {
      state.list.forEach(item => {
        item.selected = selected
      })
    },
    // 修改数量
    changeCount (state, { count, goods }) {
      // 1. 需要找到改变哪个商品的数量
      const curItem = state.list.find(item => item.skuId === goods.skuId)
      curItem.count = count
    },
    // 设置最新的购物车数据
    setList (state, list) {
      state.list = list
    }
  },
  actions: {
    // 加入购物车
    async asyncInserCart (context, goods) {
      // console.log('context', context)
      if (context.rootState.user.profile.token) {
        // 已登录状态
        // console.log('已登录状态')
        const { skuId, count } = goods
        await reqInsertCart({ skuId, count })
        await context.dispatch('asyncUpdateCart')
      } else {
        // 未登录状态
        context.commit('insertCart', goods)
      }
    },
    // 删除
    // asyncDelCart (context, goods) {
    //   return new Promise((resolve, reject) => {
    //     if (context.rootState.user.profile.token) {
    //       // 已登录状态
    //       // console.log('已登录状态')
    //     } else {
    //       // 未登录状态
    //       context.commit('delCart', goods)
    //       resolve()
    //     }
    //   })
    // },
    async asyncDelCart (context, goods) {
      if (context.rootState.user.profile.token) {
        // 已登录状态
        // console.log('已登录状态')
        await reqDeleteCart([goods.skuId])
        await context.dispatch('asyncUpdateCart')
      } else {
        // 未登录状态
        context.commit('delCart', goods)
      }
    },
    // 更新购物车
    asyncUpdateCart (context) {
      return new Promise((resolve, reject) => {
        if (context.rootState.user.profile.token) {
          // 已登录状态
          // console.log('已登录状态')
          reqFindCartList().then(res => {
            console.log('来自服务端最新的购物车数据', res)
            context.commit('setList', res.result)
            resolve()
          })
        } else {
          // 未登录状态
          // 因为每一个商品都需要更新状态,所以遍历一下,每个商品都要调接口
          const requestArr = context.state.list.map(item => {
            return getNewCartGoods(item.skuId)
          })
          console.log('请求数组', requestArr)
          Promise.all(requestArr).then(res => {
            console.log('promise.all的返回值', res)
            res.forEach((item, index) => {
              context.commit('updateCart', {
                skuId: context.state.list[index].skuId,
                ...item.result
              })
            })
            resolve()
          })
        }
      })
    },
    // 单选
    async asyncSingleCheck (context, { selected, goods }) {
      if (context.rootState.user.profile.token) {
        // 已登录状态
        // console.log('已登录状态')
        await reqUpdateCartSku({
          skuId: goods.skuId,
          selected: selected
        })
        await context.dispatch('asyncUpdateCart')
      } else {
        // 未登录状态
        context.commit('singleCheck', { selected, goods })
      }
    },
    // 全选
    async asyncCheckEffectAll (context, selected) {
      if (context.rootState.user.profile.token) {
        // 已登录状态
        // console.log('已登录状态')
        const ids = context.getters.effectiveList.map(item => {
          return item.skuId
        })
        await reqCheckAllCart({ selected, ids })
        await context.dispatch('asyncUpdateCart')
      } else {
        // 未登录状态
        context.commit('checkEffectAll', selected)
      }
    },
    // 修改数量
    async asyncChangeCount (context, { count, goods }) {
      if (context.rootState.user.profile.token) {
        // 已登录状态
        // console.log('已登录状态')
        await reqUpdateCartSku({
          skuId: goods.skuId,
          count: count
        })
        await context.dispatch('asyncUpdateCart')
      } else {
        // 未登录状态
        context.commit('changeCount', { count, goods })
      }
    },
    // 合并购物车
    async asyncMergeLocalCart (context) {
      // 拼接口参数
      const cartList = context.state.list.map(({ skuId, selected, count }) => {
        return { skuId, selected, count }
      })
      console.log('cartList', cartList)
      await reqMergeLocalCart(cartList)
      await context.dispatch('asyncUpdateCart')
      // 还会干别的
    }
  },
  getters: {
    // 有效商品的列表
    effectiveList (state) {
      return state.list.filter(item => item.stock > 0 && item.isEffective)
    },
    // 有效商品的总数量  每个商品count 相加
    // gettes的参数  state, getters, rootState, rootGetters
    effectiveTotal (state, getters) {
      return getters.effectiveList.reduce((sum, item) => sum + item.count, 0)
    },
    // 有效商品的总价格
    effectiveTotalPrice (state, getters) {
      return getters.effectiveList.reduce((sum, item) => sum + item.count * item.nowPrice, 0).toFixed(2)
    },
    ineffectiveList (state) {
      return state.list.filter(item => !(item.stock > 0 && item.isEffective))
    },
    // 筛选已选中的商品列表
    selectedList (state, getters) {
      return state.list.filter(item => item.selected)
    },
    // 选中商品的个数
    selectedAllCounts (state, getters) {
      return getters.selectedList.reduce((sum, item) => sum + item.count, 0)
    },
    // 选中商品的总价格
    selectedAllPrice (state, getters) {
      return getters.selectedList.reduce((sum, item) => sum + item.count * item.nowPrice, 0).toFixed(2)
    },
    // 是否全部选中
    isAllEffectSelected (state, getters) {
      return getters.effectiveList.every(item => item.selected) && getters.effectiveList.length > 0
    }
  }
}
